<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    //工厂模式
    // function Factoty(name,age){
    //     // let obj = {};
    //     this.name = name;
    //     this.age = age ;
    //     // return obj
    // }
    // // Factoty.prototype.erzi=function(){console.log(111);}
    // // let zhangsan = Factoty("张三",20);
    // // console.log(zhangsan);
    // //二 使用构造函数创建一个工厂模式
    // function myNew(fn,name,age){
    //     let obj = {};
    //     obj.__proto__=fn.prototype;
    //     console.log(fn.prototype);
    //     fn.call(obj,name,age);
    //     if(typeof fn()=="undefined"){
    //         return obj
    //     }else{
    //         return fn()
    //     }
    // }
    // let myobj= myNew(Factoty,"张三",20)
    // console.log(myobj);


    // class Factoty{ //ES6方法
    //     constructor(name,age){
    //         let obj = {};
    //         obj.name = name;
    //         obj.age = age;
            
    //         return obj
    //     }
    // }
    // let myobj =new Factoty("张三",20);
    // console.log(myobj);


       // 观察者模式：（自定义事件）
        // 发布订阅模式 也是观察者模式

        //    let btn =  document.querySelector(".btn");
        // //    btn.onclick = function(){
        // //        console.log("click");
        // //    }  
        // // 事件绑定 事件监听 
        // // 1.延迟执行 2.一对多  
        // btn.addEventListener("click",function(){
        //     console.log("点击了");
        // })
        // btn.addEventListener("click",function(){
        //     console.log("点击了11");
        // })
        // btn.addEventListener("click",function(){
        //     console.log("点击了222");
        // })
        // 触发事件


        // 自定义事件

        // let obj1 = {
        //     fn1:function(){
        //         console.log("执行了111");
        //     },
        //     fn2:function(){
        //         console.log("执行了222");
        //     },
        // }
        // let handler = {};
        // // 添加自定义事件绑定
        // function addEvent(eventName,fn){
        //     // 通过 handle 来保存下来，等到需要执行的时候在执行
        //     // {自定义事件名(click):[fn1,fn2,fn3...]}
        //     if(typeof handler[eventName] == "undefined"){
        //         // 把对象初始化成一个数组
        //         handler[eventName] = [];
        //         // {myevent:[fn,fn1,fn2]}
        //     }
        //     handler[eventName].push(fn)//对一个元素进行监听然后传入两个封装的函数
        
        // }

        // // 写一个函数触发自定义事件
        // // 触发 ：把保存的函数 拿出来执行就可以了
        // function trigger(eventName){
        //     handler[eventName].forEach(fn=>{
        //         fn();
        //     })
        // }
        // // 绑定事件
        // addEvent("myevent",obj1.fn1);
        // addEvent("myevent",obj1.fn2);
        // // console.log(handler);
        // // addEvent("myevent",obj1.fn2);
        // document.onclick = function(){
        //     trigger("myevent"); // 执行事件
        // }

</script>
</html>